home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
xpaint-2.1.1
/
selectOp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-03
|
21KB
|
754 lines
/* +-------------------------------------------------------------------+ */
/* | Copyright 1992, 1993, David Koblas (koblas@netcom.com) | */
/* | | */
/* | Permission to use, copy, modify, and to distribute this software | */
/* | and its documentation for any purpose is hereby granted without | */
/* | fee, provided that the above copyright notice appear in all | */
/* | copies and that both that copyright notice and this permission | */
/* | notice appear in supporting documentation. There is no | */
/* | representations about the suitability of this software for | */
/* | any purpose. this software is provided "as is" without express | */
/* | or implied warranty. | */
/* | | */
/* +-------------------------------------------------------------------+ */
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/cursorfont.h>
#include <X11/Xaw/Toggle.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Scrollbar.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/Xaw/Command.h>
#include <X11/Shell.h>
#include <stdio.h>
#include "xpaint.h"
#include "misc.h"
#include "Paint.h"
#include "palette.h"
/*
** It is now historical, that the Box and Area selection
** operations are contained in the same file.
*/
static int cutMode = 0;
static unsigned char backgroundRGB[3] = { 255, 255, 255 };
static unsigned char varianceRGB[3] = { 0, 0, 0 };
typedef struct {
Boolean area; /* area or box */
Boolean lastType;
Widget w;
Drawable drawable;
Boolean drawn;
int wx, wy, dx, dy;
/*
** The point region for area operators
*/
int size, npoint;
XPoint *real_p, *window_p;
/*
** The rectangles for a box
*/
int lastX, lastY;
XRectangle rect;
GC gcx;
/*
** The interesting stuff, for the active region
** the important part of pixBox is the width, height
** the x,y is where it is presently located on the screen.
*/
XRectangle pixBox;
} LocalInfo;
#define MKRECT(rect, sx, sy, ex, ey, typeFlag) do { \
if (typeFlag) { \
(rect)->width = MIN(ABS(sx - ex),ABS(sy - ey)); \
(rect)->height = (rect)->width; \
(rect)->x = (ex - sx < 0) ? sx - (rect)->width : sx; \
(rect)->y = (ey - sy < 0) ? sy - (rect)->height : sy; \
} else { \
(rect)->x = MIN(sx, ex); \
(rect)->y = MIN(sy, ey); \
(rect)->width = MAX(sx, ex) - (rect)->x; \
(rect)->height = MAX(sy, ey) - (rect)->y; \
} \
} while (0)
/*
** press
*/
static void press(Widget w, LocalInfo *l, XButtonEvent *event, OpInfo *info)
{
/*
** Check to make sure all buttons are up, before doing this
*/
if ((event->state & (Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask)) != 0)
return;
if (info->surface == opWindow) {
l->w = w;
l->wx = event->x;
l->wy = event->y;
l->drawn = False;
return;
}
/*
** Must be on the surface == pixmap now
*/
l->drawable = info->drawable;
l->real_p[0].x = info->x;
l->real_p[0].y = info->y;
l->window_p[0].x = l->wx - info->zoom / 2;
l->window_p[0].y = l->wy - info->zoom / 2;
l->npoint = 1;
}
static void keyPress(Widget w, LocalInfo *l, XKeyEvent *event, OpInfo *info)
{
KeySym keysym;
int len, i;
char buf[21];
if ((len = XLookupString(event, buf, sizeof(buf) - 1, &keysym, NULL)) == 0)
return;
/*
** Look for either backspace or delete and remove region
*/
for (i = 0; i < len; i++) {
if (buf[i] == 0x08 || buf[i] == 0x7f) {
PwRegionClear(w);
return;
}
}
}
/*
** motion
*/
static void motionBoxBand(Widget w, LocalInfo *l, XMotionEvent *event, OpInfo *info)
{
XRectangle rect;
if (l->drawn) {
MKRECT(&rect, l->window_p[0].x, l->window_p[0].y,
l->lastX, l->lastY, l->lastType);
XDrawRectangles(XtDisplay(w), XtWindow(w), l->gcx, &rect, 1);
}
l->lastX = event->x - info->zoom / 2;
l->lastY = event->y - info->zoom / 2;
l->lastType = (event->state & ShiftMask);
if (l->drawn = (l->window_p[0].x != l->lastX && l->window_p[0].y != l->lastY)) {
MKRECT(&rect, l->window_p[0].x, l->window_p[0].y,
l->lastX, l->lastY, l->lastType);
XDrawRectangles(XtDisplay(w), XtWindow(w), l->gcx, &rect, 1);
}
}
static void motionAreaBand(Widget w, LocalInfo *l, XMotionEvent *event, OpInfo *info)
{
if (l->npoint != 0 && (l->real_p[l->npoint - 1].x == info->x) && (l->real_p[l->npoint - 1].y == info->y))
return;
l->window_p[l->npoint].x = event->x;
l->window_p[l->npoint].y = event->y;
l->real_p[l->npoint].x = info->x;
l->real_p[l->npoint].y = info->y;
XDrawLine(XtDisplay(w), XtWindow(w), l->gcx,
l->window_p[l->npoint-1].x,
l->window_p[l->npoint-1].y,
l->window_p[l->npoint].x,
l->window_p[l->npoint].y);
XDrawPoint(XtDisplay(w), XtWindow(w), l->gcx,
l->window_p[l->npoint].x,
l->window_p[l->npoint].y);
l->npoint++;
if (l->npoint > l->size - 3) {
l->size += 256;
l->real_p = (XPoint*)XtRealloc((XtPointer)l->real_p,
l->size * sizeof(XPoint));
l->window_p = (XPoint*)XtRealloc((XtPointer)l->window_p,
l->size * sizeof(XPoint));
}
}
static void motion(Widget w, LocalInfo *l, XMotionEvent *event, OpInfo *info)
{
if (l->area)
motionAreaBand(w, l, event, info);
else
motionBoxBand(w, l, event, info);
}
static Boolean chromaCut(Widget w, LocalInfo *l, Pixmap *mask)
{
GC gc;
XImage *src, *mimg;
XRectangle *rect = PwScaleRectangle(w, &l->pixBox);
int x, y, count = 0;
Pixel p;
XColor *xcol;
int br, bg, bb;
int vr, vg, vb;
int pr, pg, pb;
Boolean mode = (cutMode == 1);
Palette *map;
Colormap cmap;
int step;
src = PwGetImage(w, rect);
XtVaGetValues(GetShell(w), XtNcolormap, &cmap, NULL);
map = PaletteFind(w, cmap);
if (*mask != None) {
mimg = XGetImage(XtDisplay(w), *mask, 0, 0, rect->width, rect->height, AllPlanes, ZPixmap);
} else {
char *data = (char*)XtMalloc(rect->width * rect->height * sizeof(long));
int i;
mimg = NewXImage(XtDisplay(w), DefaultVisualOfScreen(XtScreen(w)), 1, rect->width, rect->height);
memset(mimg->data, ~0, rect->height * mimg->bytes_per_line);
}
br = backgroundRGB[0];
bg = backgroundRGB[1];
bb = backgroundRGB[2];
vr = varianceRGB[0];
vg = varianceRGB[1];
vb = varianceRGB[2];
if (rect->height * rect->width > 2048)
StateSetBusy(True);
step = 256 * 64 / rect->width;
for (y = 0; y < rect->height; y++) {
for (x = 0; x < rect->width; x++) {
if (!XGetPixel(mimg, x, y))
continue;
p = XGetPixel(src, x + rect->x, y + rect->y);
xcol = PaletteLookup(map, p);
pr = (xcol->red >> 8) & 0xff;
pg = (xcol->green >> 8) & 0xff;
pb = (xcol->blue >> 8) & 0xff;
if (((br - vr) <= pr && pr <= (br + vr) &&
(bg - vg) <= pg && pg <= (bg + vg) &&
(bb - vb) <= pb && pb <= (bb + vb)) == mode)
XPutPixel(mimg, x, y, False);
else
count++;
}
if (y % step == 0)
StateTimeStep();
}
if (count != 0) {
/*
** Not a solid region.
*/
if (*mask == None)
*mask = XCreatePixmap(XtDisplay(w), XtWindow(w), rect->width, rect->height, 1);
gc = XCreateGC(XtDisplay(w), *mask, 0, 0);
XPutImage(XtDisplay(w), *mask, gc, mimg, 0, 0, 0, 0, rect->width, rect->height);
XFreeGC(XtDisplay(w), gc);
}
XDestroyImage(mimg);
if (rect->height * rect->width > 2048)
StateSetBusy(False);
return count != 0;
}
static void releaseBoxBand(Widget w, LocalInfo *l, XButtonEvent *event, OpInfo *info)
{
XRectangle rect;
int width, height;
MKRECT(&rect, l->window_p[0].x, l->window_p[0].y, l->lastX, l->lastY, l->lastType);
if (l->drawn)
XDrawRectangles(XtDisplay(w), XtWindow(w), l->gcx, &rect, 1);
MKRECT(&l->pixBox, l->real_p[0].x, l->real_p[0].y, info->x, info->y, l->lastType);
XtVaGetValues(w, XtNdrawWidth, &width, XtNdrawHeight, &height, NULL);
if (l->pixBox.x + l->pixBox.width > width)
l->pixBox.width = width - l->pixBox.x;
if (l->pixBox.y + l->pixBox.height > height)
l->pixBox.height = height - l->pixBox.y;
if (l->pixBox.x < 0) {
l->pixBox.width += l->pixBox.x;
l->pixBox.x = 0;
}
if (l->pixBox.y < 0) {
l->pixBox.height += l->pixBox.y;
l->pixBox.y = 0;
}
}
static Boolean releaseAreaBand(Widget w, LocalInfo *l, XButtonEvent *event, OpInfo *info, Pixmap *mask)
{
int xmax, xmin, ymax, ymin;
int width, height, i;
GC gc;
XPoint tmp;
XDrawLines(XtDisplay(w), XtWindow(w), l->gcx,
l->window_p, l->npoint, CoordModeOrigin);
if (l->npoint <= 2)
return False;
l->window_p[l->npoint] = l->window_p[0];
l->real_p[l->npoint] = l->real_p[0];
l->npoint++;
xmin = xmax = l->real_p[0].x;
ymin = ymax = l->real_p[0].y;
for (i = l->npoint - 1; i > 0; i--) {
xmin = MIN(xmin, l->real_p[i].x);
ymin = MIN(ymin, l->real_p[i].y);
xmax = MAX(xmax, l->real_p[i].x);
ymax = MAX(ymax, l->real_p[i].y);
l->window_p[i].x = l->window_p[i].x - l->window_p[i-1].x;
l->window_p[i].y = l->window_p[i].y - l->window_p[i-1].y;
l->real_p[i].x = l->real_p[i].x - l->real_p[i-1].x;
l->real_p[i].y = l->real_p[i].y - l->real_p[i-1].y;
}
XYtoRECT(xmin, ymin, xmax, ymax, &l->pixBox);
XtVaGetValues(w, XtNdrawWidth, &width, XtNdrawHeight, &height, NULL);
if (l->pixBox.x + l->pixBox.width > width)
l->pixBox.width = width - l->pixBox.x;
if (l->pixBox.y + l->pixBox.height > height)
l->pixBox.height = height - l->pixBox.y;
if (l->pixBox.x < 0) {
l->pixBox.width += l->pixBox.x;
l->pixBox.x = 0;
}
if (l->pixBox.y < 0) {
l->pixBox.height += l->pixBox.y;
l->pixBox.y = 0;
}
*mask = XCreatePixmap(XtDisplay(w), XtWindow(w),
l->pixBox.width, l->pixBox.height, 1);
gc = XCreateGC(XtDisplay(w), *mask, 0, 0);
XSetFunction(XtDisplay(w), gc, GXclear);
XFillRectangle(XtDisplay(w), *mask, gc, 0, 0, l->pixBox.width, l->pixBox.height);
XSetFunction(XtDisplay(w), gc, GXset);
tmp = l->real_p[0];
l->real_p[0].x = l->dx = l->real_p[0].x - xmin;
l->real_p[0].y = l->dy = l->real_p[0].y - ymin;
XFillPolygon(XtDisplay(w), *mask, gc, l->real_p, l->npoint,
Complex, CoordModePrevious);
l->real_p[0] = tmp;
XFreeGC(XtDisplay(w), gc);
return True;
}
static void release(Widget w, LocalInfo *l, XButtonEvent *event, OpInfo *info)
{
int mask;
Pixmap mpix;
/*
** Check to make sure all buttons are up, before doing this
*/
mask = Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask;
switch (event->button) {
case Button1: mask ^= Button1Mask; break;
case Button2: mask ^= Button2Mask; break;
case Button3: mask ^= Button3Mask; break;
case Button4: mask ^= Button4Mask; break;
case Button5: mask ^= Button5Mask; break;
}
if ((event->state & mask) != 0)
return;
mpix = None;
if (l->area) {
if (releaseAreaBand(w, l, event, info, &mpix) == False) {
PwRegionFinish(w, True);
return;
}
} else {
releaseBoxBand(w, l, event, info);
}
if (l->pixBox.width <= 1 || l->pixBox.height <= 1) {
PwRegionFinish(w, True);
return;
}
if (cutMode != 0 && !chromaCut(w, l, &mpix)) {
PwRegionFinish(w, True);
return;
}
PwRegionSet(w, &l->pixBox, None, mpix);
}
/*
** Those public functions
*/
void *SelectBoxAdd(Widget w)
{
LocalInfo *l = (LocalInfo*)XtMalloc(sizeof(LocalInfo));
l->area = False;
l->lastType = False;
l->gcx = GetGCX(w);
l->size = 8;
l->real_p = (XPoint *)XtCalloc(sizeof(XPoint), l->size);
l->window_p = (XPoint *)XtCalloc(sizeof(XPoint), l->size);
XtVaSetValues(w, XtNcompress, True, NULL);
OpAddEventHandler(w, opWindow|opPixmap, ButtonPressMask, FALSE, (OpEventProc)press, l);
OpAddEventHandler(w, opWindow, ButtonMotionMask, FALSE, (OpEventProc)motion, l);
OpAddEventHandler(w, opWindow, ButtonReleaseMask, FALSE, (OpEventProc)release, l);
OpAddEventHandler(w, opWindow, KeyPressMask, FALSE, (OpEventProc)keyPress, l);
SetCrossHairCursor(w);
return l;
}
void SelectBoxRemove(Widget w, LocalInfo *l)
{
OpRemoveEventHandler(w, opWindow|opPixmap, ButtonPressMask, FALSE, (OpEventProc)press, l);
OpRemoveEventHandler(w, opWindow, ButtonMotionMask, FALSE, (OpEventProc)motion, l);
OpRemoveEventHandler(w, opWindow, ButtonReleaseMask, FALSE, (OpEventProc)release, l);
OpRemoveEventHandler(w, opWindow, KeyPressMask, FALSE, (OpEventProc)keyPress, l);
PwRegionFinish(w, False);
XtFree((XtPointer)l->window_p);
XtFree((XtPointer)l->real_p);
XtFree((XtPointer)l);
}
void *SelectAreaAdd(Widget w)
{
LocalInfo *l = (LocalInfo*)XtMalloc(sizeof(LocalInfo));
l->area = True;
l->gcx = GetGCX(w);
XtVaSetValues(w, XtNcompress, False, NULL);
l->size = 256;
l->real_p = (XPoint *)XtCalloc(sizeof(XPoint), l->size);
l->window_p = (XPoint *)XtCalloc(sizeof(XPoint), l->size);
OpAddEventHandler(w, opWindow|opPixmap, ButtonPressMask, FALSE, (OpEventProc)press, l);
OpAddEventHandler(w, opWindow, ButtonMotionMask, FALSE, (OpEventProc)motion, l);
OpAddEventHandler(w, opWindow, ButtonReleaseMask, FALSE, (OpEventProc)release, l);
OpAddEventHandler(w, opWindow, KeyPressMask, FALSE, (OpEventProc)keyPress, l);
SetPencilCursor(w);
return l;
}
void SelectAreaRemove(Widget w, LocalInfo *l)
{
OpRemoveEventHandler(w, opWindow|opPixmap, ButtonPressMask, FALSE, (OpEventProc)press, l);
OpRemoveEventHandler(w, opWindow, ButtonMotionMask, FALSE, (OpEventProc)motion, l);
OpRemoveEventHandler(w, opWindow, ButtonReleaseMask, FALSE, (OpEventProc)release, l);
OpRemoveEventHandler(w, opWindow, KeyPressMask, FALSE, (OpEventProc)keyPress, l);
PwRegionFinish(w, False);
XtFree((XtPointer)l->window_p);
XtFree((XtPointer)l->real_p);
XtFree((XtPointer)l);
}
/*
** Dialog box
*/
typedef struct {
Widget redBar, greenBar, blueBar;
Widget redText, greenText, blueText;
Widget mode;
Widget shell;
float r, g, b;
float vr, vg, vb;
Pixel pixel;
} DialogInfo;
static DialogInfo *dInfo = NULL;
static void closePopup(Widget w, Widget shell)
{
XtPopdown(shell);
}
static void barCB(Widget bar, DialogInfo *l, float *percent)
{
Widget t;
char buf[20];
if (l->redBar == bar) {
l->vr = *percent;
t = l->redText;
} else if (l->greenBar == bar) {
l->vg = *percent;
t = l->greenText;
} else if (l->blueBar == bar) {
l->vb = *percent;
t = l->blueText;
} else {
return;
}
sprintf(buf, "%d", (int)(255 * *percent));
XtVaSetValues(t, XtNstring, buf, NULL);
}
static Widget addSB(Widget parent, Widget above, char *title, Widget *bar, Widget *text)
{
Widget form, label;
form = XtVaCreateManagedWidget("form", formWidgetClass, parent,
XtNborderWidth, 0,
XtNfromVert, above,
NULL);
label = XtVaCreateManagedWidget("varianceLabel", labelWidgetClass, form,
XtNlabel, title,
XtNborderWidth, 0,
XtNright, XtChainLeft,
XtNleft, XtChainLeft,
NULL);
*bar = XtVaCreateManagedWidget("varianceBar", scrollbarWidgetClass, form,
XtNorientation, XtorientHorizontal,
XtNfromHoriz, label,
XtNleft, XtChainLeft,
NULL);
*text = XtVaCreateManagedWidget("varianceText", asciiTextWidgetClass, form,
XtNfromHoriz, *bar,
XtNeditType, XawtextEdit,
XtNwrap, XawtextWrapNever,
XtNresize, XawtextResizeWidth,
XtNwidth, 50,
XtNlength, 5,
XtNstring, "0",
NULL);
return form;
}
static void deltaCB(Widget w, DialogInfo *l, XtPointer junk)
{
XColor *xcol, xcol2;
int dr, dg, db;
char buf[20];
xcol = DoGrabColor(w);
xcol2.pixel = l->pixel;
XQueryColor(XtDisplay(w), DefaultColormapOfScreen(XtScreen(w)), &xcol2);
dr = xcol->red - xcol2.red;
dg = xcol->green - xcol2.green;
db = xcol->blue - xcol2.blue;
if (dr < 0) dr = -dr;
if (dg < 0) dg = -dg;
if (db < 0) db = -db;
l->vr = (float)((dr >> 8) & 0xff) / 255.0;
l->vg = (float)((dg >> 8) & 0xff) / 255.0;
l->vb = (float)((db >> 8) & 0xff) / 255.0;
sprintf(buf, "%d", (int)(255 * l->vr));
XtVaSetValues(l->redText, XtNstring, buf, NULL);
XawScrollbarSetThumb(l->redBar, l->vr, -1.0);
sprintf(buf, "%d", (int)(255 * l->vg));
XtVaSetValues(l->greenText, XtNstring, buf, NULL);
XawScrollbarSetThumb(l->greenBar, l->vg, -1.0);
sprintf(buf, "%d", (int)(255 * l->vb));
XtVaSetValues(l->blueText, XtNstring, buf, NULL);
XawScrollbarSetThumb(l->blueBar, l->vb, -1.0);
}
static void applyCB(Widget w, DialogInfo *l, XtPointer junk)
{
XColor xcol;
int t;
xcol.pixel = l->pixel;
xcol.flags = DoRed|DoGreen|DoBlue;
XQueryColor(XtDisplay(w), DefaultColormapOfScreen(XtScreen(w)), &xcol);
backgroundRGB[0] = (xcol.red >> 8) & 0xff;
backgroundRGB[1] = (xcol.green >> 8) & 0xff;
backgroundRGB[2] = (xcol.blue >> 8) & 0xff;
#define STUFF(src, dst) \
t = (src) * 255; if (t < 0) t = 0; else if (t > 255) t = 255; dst = t
STUFF(l->vr, varianceRGB[0]);
STUFF(l->vg, varianceRGB[1]);
STUFF(l->vb, varianceRGB[2]);
#undef STUFF
if (l->mode != None)
cutMode = ((int)XawToggleGetCurrent(l->mode)) - 1;
OperationSelectCallAcross(cutMode);
}
static void okCB(Widget w, DialogInfo *l, XtPointer junk)
{
applyCB(w,l,junk);
closePopup(w, GetShell(w));
}
void SelectChromaDialog(Widget w)
{
Widget topform, form, cpick, ok, cancel, apply;
Widget label, tog;
Widget above;
DialogInfo *l = dInfo;
if (l != NULL && l->shell != None) {
if (l->mode != None)
XawToggleSetCurrent(l->mode, (XtPointer)(cutMode+1));
XtPopup(l->shell, XtGrabNone);
XMapRaised(XtDisplay(l->shell), XtWindow(l->shell));
return;
}
dInfo = l = XtNew(DialogInfo);
l->r = (float)backgroundRGB[0] / 255.0;
l->g = (float)backgroundRGB[1] / 255.0;
l->b = (float)backgroundRGB[2] / 255.0;
l->vr = (float)varianceRGB[0] / 255.0;
l->vg = (float)varianceRGB[1] / 255.0;
l->vb = (float)varianceRGB[2] / 255.0;
l->shell = XtVaCreatePopupShell("chroma", topLevelShellWidgetClass, GetToplevel(w),
NULL);
topform = XtVaCreateManagedWidget("form", formWidgetClass, l->shell,
NULL);
/*
** First create the list of toggle buttons for the mode selection
*/
#if 0
form = XtVaCreateManagedWidget("form", formWidgetClass, topform,
XtNborderWidth, 0,
NULL);
label = XtVaCreateManagedWidget("selectModeLabel", labelWidgetClass, form,
XtNborderWidth, 0,
NULL);
/*
** radioData = mode + 1
*/
tog = None;
tog = XtVaCreateManagedWidget("mode0", toggleWidgetClass, form,
XtNfromVert, label,
XtNradioGroup, tog,
XtNradioData, 1,
XtNstate, (cutMode == 0),
NULL);
tog = XtVaCreateManagedWidget("mode1", toggleWidgetClass, form,
XtNfromVert, tog,
XtNradioGroup, tog,
XtNradioData, 2,
XtNstate, (cutMode == 1),
NULL);
tog = XtVaCreateManagedWidget("mode2", toggleWidgetClass, form,
XtNfromVert, tog,
XtNradioGroup, tog,
XtNradioData, 3,
XtNstate, (cutMode == 2),
NULL);
l->mode = tog;
#else
l->mode = None;
#endif
/*
** Now the color choser.
*/
form = XtVaCreateManagedWidget("form", formWidgetClass, topform,
#if 0
XtNfromHoriz, form,
#endif
XtNborderWidth, 0,
NULL);
cpick = ColorPicker(form, DefaultColormapOfScreen(XtScreen(w)), NULL);
l->pixel = ColorPickerGetPixel(cpick);
above = XtVaCreateManagedWidget("delta", commandWidgetClass, form,
XtNfromVert, cpick,
NULL);
XtAddCallback(above, XtNcallback, (XtCallbackProc)deltaCB, (XtPointer)l);
above = addSB(form, above, "Red Variance",
&l->redBar, &l->redText);
above = addSB(form, above, "Green Variance",
&l->greenBar, &l->greenText);
above = addSB(form, above, "Blue Variance",
&l->blueBar, &l->blueText);
XtAddCallback(l->redBar, XtNjumpProc, (XtCallbackProc)barCB, (XtPointer)l);
XtAddCallback(l->greenBar, XtNjumpProc, (XtCallbackProc)barCB, (XtPointer)l);
XtAddCallback(l->blueBar, XtNjumpProc, (XtCallbackProc)barCB, (XtPointer)l);
AddDestroyCallback(l->shell, (void (*)(Widget, void *, XEvent *))closePopup, l->shell);
ok = XtVaCreateManagedWidget("ok", commandWidgetClass, form,
XtNfromVert, above,
NULL);
apply = XtVaCreateManagedWidget("apply", commandWidgetClass, form,
XtNfromVert, above,
XtNfromHoriz, ok,
NULL);
cancel = XtVaCreateManagedWidget("cancel", commandWidgetClass, form,
XtNfromVert, above,
XtNfromHoriz, apply,
NULL);
XtAddCallback(cancel, XtNcallback, (XtCallbackProc)closePopup, (XtPointer)l->shell);
XtAddCallback(apply, XtNcallback, (XtCallbackProc)applyCB, (XtPointer)l);
XtAddCallback(ok, XtNcallback, (XtCallbackProc)okCB, (XtPointer)l);
XtPopup(l->shell, XtGrabNone);
}
void SelectSetCutMode(int value)
{
cutMode = value;
if (dInfo != NULL && dInfo->mode != None)
XawToggleSetCurrent(dInfo->mode, (XtPointer)(cutMode+1));
}